package com.tedu.api.thread;

import com.sun.javafx.collections.MappingChange;
import org.junit.Test;

import java.io.File;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式--> ()->{} 【接口/抽象类--匿名内部类】
 *                       【集合遍历--匿名内部类】
 * Collection--->List:存重复元素并且有序【保存数据结构一致】
 *               Set:存无序并且不重复【保存数据结构一致】
 *               Queue:队列结合业务
 * Map---------->HashMap：键值对存储
 *
 */
public class LambdaDemo {
    @Test
    public void testList() {
        //List集合：保存元素
        List<String> list = new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白石山");
        //集合3种遍历方式 ：普通for、增强for、支持forEach方法
        for (String str : list) {
            System.out.println("增强for：" + str);
        }
        //支持forEach方法：遍历集合元素
        // Consumer针对List、set、Queue集合提供接口：功能获取List集合元素
        //accept() 获取list集合的所有元素
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("consumer接口遍历方案" + s);
            }
        });
        //支持forEach方法：遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach(s -> System.out.println("Lambda遍历方案：" + s));
    }


    @Test
    public void testMap() {
        //创建Map集合:键值对
        Map<Integer, String> HashMap;
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "唐山");
        map.put(2, "石家庄");
        map.put(3, "秦皇岛");
        map.put(4, "邯郸");
        //遍历集合：普通for、增强for、forEach(BiConSummer接口--匿名内部类)
        //键值对-->一组Entry对象
        //BiConSummer接口---获取每组Entry对象---accept() 获取Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键：" + integer + "值：" + s);
            }
        });

        //使用Lambda表达式
        map.forEach((i, s) -> System.out.println("lambda值：" + s));

    }

/**
 * 作业：  1.使用Lambda表达式完成 Thread线程创建
 *        2.使用Lambda表达式完成 Runnable线程创建
 *        3.IO流--File类：listFile(FileFilter接口)【5行代码】
 *         目标：【iO包下FilterAPI类】实现使用Lambda表达式完成
 *        4.IO流--File类：listFile(FileFilter接口)【2行代码】
 *         目标：【iO包下FilterAPI类】实现使用Lambda表达式完成
 *        5.集合：
 *        目标：【List包下ListAPI下类单元测试：testComparator()】
 *        LambdaDemo类下--完成作业
 *   @LambdaHomeWork1
 *    提交11.8    中午12.
 */
    @Test
    public void LambdaHomeWork1() {
    //1.使用Lambda表达式完成 Thread线程创建
    //Thread类Java定义线程类--具备启动start---
    //Thread类封装Runnable类--线程run运行
    Thread t1 = new Thread(() -> {
        for (int i = 0; i < 1000; i++) {
            System.out.println("one");
        }
    });
    t1.start();
}

    @Test
    public void LambdaHomeWork2() {
        //1.创建Runnable接口
        Runnable r = () -> {
            for (int i = 0; i < 1000; i++) {
                System.out.println("two");
            }
        };
        //2.创建Thread线程类 --start()
        Thread t2 = new Thread(r);
        //3.启动线程
        t2.start();
    }

    @Test
    public void LambdaHomeWork3() {
        File file = new File("." + File.separator);
        File[] subs = file.listFiles(pathname ->{
            String name = pathname.getName();
            return name.startsWith("s");
        });
        for (int i = 0; i < subs.length; i++){
            System.out.println("所有的文件文件夹的名：" + subs[i].getName());
        }
    }

    @Test
    public void LambdaHomeWork4() {
        for (File f : new File("." + File.separator).listFiles((pathname) -> {return pathname.getName().startsWith("s");})) {
            System.out.println("遍历后过滤完成：" + f);
        }
    }

    @Test
    public void LambdaHomeWork5(){
        List<String> list=new ArrayList<>();
        list.add("阿西吧");
        list.add("搜得死内");
        list.add("呦西");
        Comparator<String>com=(o1, o2)->o2.length()-o1.length();
        Collections.sort(list,com);
        System.out.println("排序后的集合："+list);
    }
}












